#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1003;
int f[maxn][105][105];  //i 时间 次数
int cost[maxn];
int value[maxn];
int cnt[maxn];
int T,n;


int main()
{
    cin>>n>>T;
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        cin>>cost[i];
        cin>>value[i];
        cin>>cnt[i];
    }
    for(int j=1;j<=n;j++)  //对每种草药进行枚举
        for(int t=0;t<=T;t++)
        {
            for(int c=0;c<=cnt[j];c++)
            {
                if(t<cost[j] || c==0)  //当前的时间小于采这种草药的时间
                {
                    f[j][t][c] = f[j-1][t][cnt[j-1]];  //那么当前这种草药采药的价值，前一种草药用t时间采药的价值
                }
                else
                {
                    //可以选择采药，也可以不选择采药，两者之间取最大
                    //f[j][t] = max(f[j-1][t-cost[j]]+value[j], f[j-1][t]);
                    //疯狂的采药
                    int cost1 = f[j][t-cost[j]][c-1]+value[j];
                    int cost2 = f[j-1][t][cnt[j-1]];
                    f[j][t][c] = max(cost1,cost2 );

                }
            }
        }
    int cntN = cnt[n];
    cout<<f[n][T][cntN];
    return 0;
}